home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / os2 / octa209s.zip / octave-2.09 / libs / pnm / utils.c < prev   
C/C++ Source or Header  |  1997-02-01  |  6KB  |  268 lines

  1. /*
  2. *******************************************************************************
  3. ** Utilities used for reading and writing of image files                     **
  4. ** (c) 1997, Klaus Gebhardt                                                  **
  5. *******************************************************************************
  6. */
  7.  
  8. #include <stdlib.h>
  9. #include <stdio.h>
  10.  
  11. #include "oct-img.h"
  12.  
  13.  
  14. UCHAR **malloc_uchar_matrix (UINT m, UINT n)
  15. {
  16.   UINT i;
  17.   UCHAR **p;
  18.  
  19.   p = (UCHAR **) malloc (m * sizeof (UCHAR *) + m * n * sizeof (UCHAR));
  20.   if (p)
  21.     {
  22.       p[0] = (UCHAR *) (p + m);
  23.       for (i = 1; i < m; i++)  p[i] = p[i-1] + n;
  24.     }
  25.  
  26.   return p;
  27. }
  28.  
  29.  
  30. INT **malloc_int_matrix (UINT m, UINT n)
  31. {
  32.   UINT i;
  33.   INT **p;
  34.  
  35.   p = (INT **) malloc (m * sizeof (INT *) + m * n * sizeof (INT));
  36.   if (p)
  37.     {
  38.       p[0] = (INT *) (p + m);
  39.       for (i = 1; i < m; i++)  p[i] = p[i-1] + n;
  40.     }
  41.  
  42.   return p;
  43. }
  44.  
  45.  
  46. SHORT MaxValtoBits (INT maxval)
  47. {
  48.   if (maxval <= 1)            return 1;
  49.   else if (maxval <= 3)       return 2;
  50.   else if (maxval <= 7)       return 3;
  51.   else if (maxval <= 15)      return 4;
  52.   else if (maxval <= 31)      return 5;
  53.   else if (maxval <= 63)      return 6;
  54.   else if (maxval <= 127)     return 7;
  55.   else if (maxval <= 255)     return 8;
  56.   else if (maxval <= 511)     return 9;
  57.   else if (maxval <= 1023)    return 10;
  58.   else if (maxval <= 2047)    return 11;
  59.   else if (maxval <= 4095)    return 12;
  60.   else if (maxval <= 8191)    return 13;
  61.   else if (maxval <= 16383)   return 14;
  62.   else if (maxval <= 32767)   return 15;
  63.   else if (maxval <= 65535L)  return 16;
  64.   else                        return -1;
  65. }
  66.  
  67.  
  68. UINT SkipBytes (FILE *fp, UINT skip)
  69. {
  70.   if (fseek (fp, (long) skip, SEEK_CUR) != 0)  return 0;
  71.   return skip;
  72. }
  73.  
  74.  
  75. UINT PutByte (FILE *fp, UCHAR c)
  76. {
  77.   if (fputc (c, fp) == EOF)  return 0;
  78.   return 1;
  79. }
  80.  
  81. UINT PutLShort (FILE *fp, SHORT s)
  82. {
  83.   if (fputc ((s & 0xff), fp) == EOF)       return 0;
  84.   if (fputc ((s >> 8) & 0xff, fp) == EOF)  return 0;
  85.   return 2;
  86. }
  87.  
  88. UINT PutLLong (FILE *fp, INT i)
  89. {
  90.   if (fputc((i & 0xff), fp) == EOF)        return 0;
  91.   if (fputc((i >> 8) & 0xff, fp) == EOF)   return 0;
  92.   if (fputc((i >> 16) & 0xff, fp) == EOF)  return 0;
  93.   if (fputc((i >> 24) & 0xff, fp) == EOF)  return 0;
  94.   return 4;
  95. }
  96.  
  97.  
  98. UINT GetByte (FILE *fp, UCHAR *c)
  99. {
  100.   if (fread (c, 1, 1, fp) != 1)  return 0;
  101.   return 1;
  102. }
  103.  
  104. UINT GetLShort (FILE *fp, SHORT *s)
  105. {
  106.   UCHAR c;
  107.   if (fread (&c, 1, 1, fp) != 1)  return 0;
  108.   *s = c & 0xff;
  109.   if (fread (&c, 1, 1, fp) != 1)  return 0;
  110.   *s |= (c & 0xff) << 8;
  111.   return 2;
  112. }
  113.  
  114. UINT GetBShort (FILE *fp, SHORT *s)
  115. {
  116.   UCHAR c;
  117.   if (fread (&c, 1, 1, fp) != 1)  return 0;
  118.   *s = (c & 0xff) << 8;
  119.   if (fread (&c, 1, 1, fp) != 1)  return 0;
  120.   *s |= c & 0xff;
  121.   return 2;
  122. }
  123.  
  124. UINT GetLLong (FILE *fp, INT *i)
  125. {
  126.   UCHAR c;
  127.   if (fread (&c, 1, 1, fp) != 1)  return 0;
  128.   *i = c & 0xff;
  129.   if (fread (&c, 1, 1, fp) != 1)  return 0;
  130.   *i |= (c & 0xff) << 8;
  131.   if (fread (&c, 1, 1, fp) != 1)  return 0;
  132.   *i |= (c & 0xff) << 16;
  133.   if (fread (&c, 1, 1, fp) != 1)  return 0;
  134.   *i |= (c & 0xff) << 24;
  135.   return 4;
  136. }
  137.  
  138. static UINT _scanuchar (FILE *fp, UCHAR *c)
  139. {
  140.   int ich;
  141.   char ch;
  142.  
  143.   if ((ich = getc (fp)) == EOF )  return 0;
  144.   ch = (char) ich;
  145.  
  146.   if (ch == '#')
  147.     do
  148.       {
  149.     if ((ich = getc (fp)) == EOF)  return 0;
  150.     ch = (char) ich;
  151.       }
  152.     while ((ch != '\n') && (ch != '\r'));
  153.  
  154.   *c = ch;
  155.   return 1;
  156. }
  157.  
  158. UINT ScanUCHAR (FILE *fp, UCHAR *c)
  159. {
  160.   UCHAR ch;
  161.  
  162.   do
  163.     if (_scanuchar (fp, &ch) == 0)  return 0;
  164.   while ( ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r' );
  165.  
  166.   if ((ch < '0' || ch > '9'))  return 0;
  167.  
  168.   *c = 0;
  169.   do
  170.     {
  171.       *c = *c * 10 + ch - ((UCHAR) '0');
  172.       if (_scanuchar (fp, &ch) == 0)  return 0;
  173.     }
  174.   while ((ch >= '0') && (ch <= '9'));
  175.  
  176.   return 1;
  177. }
  178.  
  179. UINT ScanUINT (FILE *fp, UINT *c)
  180. {
  181.   UCHAR ch;
  182.  
  183.   do
  184.     if (_scanuchar (fp, &ch) == 0)  return 0;
  185.   while ( ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r' );
  186.  
  187.   if ((ch < '0' || ch > '9'))  return 0;
  188.  
  189.   *c = 0;
  190.   do
  191.     {
  192.       *c = *c * 10 + ch - ((UCHAR) '0');
  193.       if (_scanuchar (fp, &ch) == 0)  return 0;
  194.     }
  195.   while ((ch >= '0') && (ch <= '9'));
  196.  
  197.   return 1;
  198. }
  199.  
  200. typedef struct
  201. {
  202.   INT c;
  203.   INT n;
  204.   void *next;
  205. }
  206. TOC;
  207.  
  208. UCHAR **compute_colormap (INT **pixels, UINT x, UINT y, INT *col_max)
  209. {
  210.   TOC first = { -1, 0, NULL };
  211.   TOC *last  = NULL;
  212.   TOC *p, *q;
  213.   UINT i, j;
  214.   INT d, n = 0;
  215.   UCHAR **cm = NULL;
  216.  
  217.   *col_max = 0;
  218.  
  219.   for (i = 0; i < x; i++)
  220.     {
  221.       for (j = 0; j < y; j++)
  222.     {
  223.       d = pixels[i][j];
  224.       p = &first;
  225.  
  226.       while ((p->next) && (((TOC *) (p->next))->c < d))
  227.         p = (TOC *) p->next;
  228.  
  229.       if ((p->next) && (((TOC *) (p->next))->c == d))
  230.         pixels[i][j] = ((TOC *) (p->next))->n;
  231.       else
  232.         {
  233.           if ((q = malloc (sizeof(TOC))) == NULL)  goto end;
  234.  
  235.           q->c = d;             q->n = n;
  236.           q->next = p->next;    p->next = q;
  237.           pixels[i][j] = n;     n++;
  238.         }
  239.     }
  240.     }
  241.  
  242.   if ((cm = malloc_uchar_matrix (3, (UINT) n)) == NULL)  goto end;
  243.  
  244.   *col_max = n - 1;
  245.   p = first.next;
  246.  
  247.   while (p)
  248.     {
  249.       n = p->n;
  250.       d = p->c;    cm[2][n] = ((UCHAR) d) % 256;
  251.       d = d >> 8;  cm[1][n] = ((UCHAR) d) % 256;
  252.       d = d >> 8;  cm[0][n] = ((UCHAR) d) % 256;
  253.       p = (TOC *) p->next;
  254.     }
  255.  
  256. end:
  257.   p = first.next;
  258.  
  259.   while (p)
  260.     {
  261.       q = (TOC *) p->next;
  262.       free (p);
  263.       p = q;
  264.     }
  265.  
  266.   return cm;
  267. }
  268.